package com.ruoyi.web.controller;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SuperPoint;
import com.ruoyi.system.domain.vo.SuperPointVo;
import com.ruoyi.system.service.ISuperPointService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 用户积分Controller
 * 提供用户积分管理的REST API接口
 * 
 * @author ruoyi
 * @date 2025-08-14
 */
@RestController
@RequestMapping("/point")
public class SuperPointController extends BaseController
{
    @Autowired
    private ISuperPointService superPointService;

    /**
     * 查询用户积分列表
     * 支持分页查询和条件筛选
     */
    @PreAuthorize("@ss.hasPermi('user:point:list')")
    @GetMapping("/list")
    public TableDataInfo list(SuperPoint superPoint)
    {
        startPage();
        List<SuperPoint> list = superPointService.selectSuperPointList(superPoint);
        return getDataTable(list);
    }

    /**
     * 查询用户积分列表（包含用户信息）
     * 业务说明：通过关联查询获取积分信息和用户基本信息，用于管理后台显示
     * 返回数据包含：积分ID、用户ID、用户昵称、用户账号、积分数量、变更积分、变更类型、变更原因等
     * 
     * @param superPoint 查询条件对象
     * @return 分页的积分信息列表（包含用户信息）
     */
    @PreAuthorize("@ss.hasPermi('user:point:list')")
    @GetMapping("/listWithUser")
    public TableDataInfo listWithUser(SuperPoint superPoint)
    {
        startPage();
        List<SuperPointVo> list = superPointService.selectSuperPointVoList(superPoint);
        return getDataTable(list);
    }

    /**
     * 导出用户积分列表
     * 支持Excel格式导出，便于数据分析和备份
     */
    @PreAuthorize("@ss.hasPermi('user:point:export')")
    @Log(title = "用户积分", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SuperPoint superPoint)
    {
        List<SuperPoint> list = superPointService.selectSuperPointList(superPoint);
        ExcelUtil<SuperPoint> util = new ExcelUtil<SuperPoint>(SuperPoint.class);
        util.exportExcel(response, list, "用户积分数据");
    }

    /**
     * 获取用户积分详细信息
     * 根据积分记录ID查询详细信息
     */
    @PreAuthorize("@ss.hasPermi('user:point:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(superPointService.selectSuperPointById(id));
    }

    /**
     * 根据用户ID获取积分信息
     * 业务说明：用于快速查询指定用户的积分信息，常用于用户登录后显示积分
     * 应用场景：用户个人中心、积分查询页面等
     * 
     * @param userId 用户ID（路径参数）
     * @return 该用户的积分信息，如果用户没有积分记录则返回空数据
     */
    @PreAuthorize("@ss.hasPermi('user:point:query')")
    @GetMapping(value = "/user/{userId}")
    public AjaxResult getInfoByUserId(@PathVariable("userId") Long userId)
    {
        return success(superPointService.selectSuperPointByUserId(userId));
    }

    /**
     * 新增用户积分
     * 用于创建用户的初始积分记录
     */
    @PreAuthorize("@ss.hasPermi('user:point:add')")
    @Log(title = "用户积分", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SuperPoint superPoint)
    {
        return toAjax(superPointService.insertSuperPoint(superPoint));
    }

    /**
     * 修改用户积分
     * 用于直接修改用户的积分数量
     */
    @PreAuthorize("@ss.hasPermi('user:point:edit')")
    @Log(title = "用户积分", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SuperPoint superPoint)
    {
        return toAjax(superPointService.updateSuperPoint(superPoint));
    }

    /**
     * 增加用户积分
     * 业务说明：用于用户获得积分时的业务场景，如签到、完成任务、活动奖励等
     * 实现逻辑：直接在现有积分基础上增加指定数量，无上限限制
     * 安全考虑：需要相应的权限验证，防止恶意增加积分
     * 
     * @param userId 用户ID（请求参数）
     * @param points 增加的积分数（必须为正数）
     * @return 操作结果，成功返回1，失败返回0
     */
    @PreAuthorize("@ss.hasPermi('user:point:edit')")
    @Log(title = "增加用户积分", businessType = BusinessType.UPDATE)
    @PutMapping("/increase")
    public AjaxResult increasePoints(@RequestParam Long userId, @RequestParam Integer points)
    {

        return toAjax(superPointService.increaseUserPoints(userId, points));
    }

    /**
     * 减少用户积分
     * 业务说明：用于用户消费积分时的业务场景，如兑换商品、抵扣费用、积分扣除等
     * 实现逻辑：确保积分不会变为负数，如果积分不足则操作失败
     * 安全考虑：在SQL层面进行积分检查，防止积分变为负数
     * 
     * @param userId 用户ID（请求参数）
     * @param points 减少的积分数（必须为正数）
     * @return 操作结果，成功返回1，失败返回0（积分不足或用户不存在）
     */
    @PreAuthorize("@ss.hasPermi('user:point:edit')")
    @Log(title = "减少用户积分", businessType = BusinessType.UPDATE)
    @PutMapping("/decrease")
    public AjaxResult decreasePoints(@RequestParam Long userId, @RequestParam Integer points)
    {
        return toAjax(superPointService.decreaseUserPoints(userId, points));
    }

    /**
     * 删除用户积分
     * 支持批量删除操作
     */
    @PreAuthorize("@ss.hasPermi('user:point:remove')")
    @Log(title = "用户积分", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(superPointService.deleteSuperPointByIds(ids));
    }
}

